#pragma once
#include <string>
#include <opencv2/opencv.hpp>
#include <chrono>
#include <filesystem>
#include <iomanip>
#include "Config.h"

namespace AVSAnalyzer {
    /**
     * @brief 报警图片生成器类
     * 负责在检测到报警事件时保存报警图片
     */
    class GenerateAlarmImage {
    public:
        /**
         * @brief 构造函数
         * @param code 设备编号
         * @param controlCode 控制通道编号
         * @param config 配置信息
         */
        GenerateAlarmImage(const std::string& code, const std::string& controlCode, const Config& config);
        ~GenerateAlarmImage();

        /**
         * @brief 保存报警图片
         * @param image 要保存的图片
         * @param score 报警分数
         * @return 是否成功保存
         */
        bool saveAlarmImage(const cv::Mat& image, float score);

    private:
        /**
         * @brief 判断两张图片是否相似
         * @param img1 第一张图片
         * @param img2 第二张图片 
         * @param threshold 相似度阈值
         * @return 是否相似
         */
        bool isSimilarImage(const cv::Mat& img1, const cv::Mat& img2, float threshold = 0.95);

        /**
         * @brief 生成报警图片文件名
         * @param score 报警分数
         * @return 文件名
         */
        std::string generateFilename(float score);
        
        std::string mCode;                    // 设备编号
        std::string mControlCode;             // 控制通道编号
        std::string mAlarmDir;                // 报警图片保存目录(从配置文件获取)
        int64_t mLastImageSaveTime;           // 上次保存图片的时间戳
        cv::Mat mLastSavedImage;              // 上次保存的图片
        static constexpr int64_t IMAGE_SAVE_INTERVAL = 3000; // 图片保存最小间隔(ms)
    };
} 